package priorityqueue

type CompareFunc[T any] func(v1 T, v2 T) bool

func (cmp CompareFunc[T]) compare(v1 T, v2 T) bool {
	// 调用函数本身，实现接口方法
	return cmp(v1, v2)
}
func Swap[T any](v1 *T, v2 *T) {
	tmp := *v1
	*v1 = *v2
	*v2 = tmp
}

// 比较器接口
type Comparator[T any] interface {
	compare(v1 T, v2 T) bool
}

// 建立大堆--int特化
func IntGreater() Comparator[int] {
	return CompareFunc[int](func(v1, v2 int) bool {
		return v1 > v2
	})
}

// 建立小堆--int64特化
func Int64Less() Comparator[int64] {
	return CompareFunc[int64](func(v1, v2 int64) bool {
		return v1 < v2
	})
}

// 建立大堆--int64特化
func Int64Greater() Comparator[int64] {
	return CompareFunc[int64](func(v1, v2 int64) bool {
		return v1 > v2
	})
}

// 建立小堆--int特化
func IntLess() Comparator[int] {
	return CompareFunc[int](func(v1, v2 int) bool {
		return v1 < v2
	})
}

// 建立大堆--string特化
func StringGreater() Comparator[string] {
	return CompareFunc[string](func(s1, s2 string) bool {
		return s1 > s2
	})
}

// 建立小堆--string特化
func StringLess() Comparator[string] {
	return CompareFunc[string](func(v1, v2 string) bool {
		return v1 < v2
	})
}

// 建立大堆-- Byte特化
func ByteGreater() Comparator[byte] {
	return CompareFunc[byte](func(s1, s2 byte) bool {
		return s1 > s2
	})
}

// 建立小堆-- Byte特化
func ByteLess() Comparator[byte] {
	return CompareFunc[byte](func(v1, v2 byte) bool {
		return v1 < v2
	})
}
